<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
<html>
<head>
<title>
JSJaC Overview
</title>
<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script>
function asd() {
	
		parent.document.title="JSJaCHttpPollingConnection.js Overview";
	
}
</script>
</head>
<body bgcolor="white" onload="asd();">

<!-- ========== START OF NAVBAR ========== -->
<a name="navbar_top"><!-- --></a>
<table border="0" width="100%" cellpadding="1" cellspacing="0">
<tr>
<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
<a name="navbar_top_firstrow"><!-- --></a>
<table border="0" cellpadding="0" cellspacing="3">
  <tr align="center" valign="top">
  
  
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a>&nbsp;</td>
  <td bgcolor="#FFFFFF" class="NavBarCell1Rev">	&nbsp;<font class="NavBarFont1Rev"><b>File</b></font>&nbsp;</td>
  

  <td bgcolor="#FFFFFF" class="NavBarCell1"> 	<font class="NavBarFont1">Class</font>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a>&nbsp;</td>
  </tr>
</table>
</td>
<td bgcolor="#EEEEFF" align="right" valign="top">
<em>
<b>JSJaC</b></em>
</td>
</tr>

<tr>
<td bgcolor="white" class="NavBarCell2"><font size="-2">
&nbsp;PREV&nbsp;
&nbsp;NEXT</font></td>
<td bgcolor="white" class="NavBarCell2"><font size="-2">
  <a href="index.html" target="_top"><b>FRAMES</b></a>  &nbsp;
&nbsp;<a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
&nbsp;&nbsp;
<script>
  <!--
  if(window==top) {
    document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
  }
  //-->
</script>
<noscript>
<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
</noscript>
</font></td>
</tr>
</table>
<!-- =========== END OF NAVBAR =========== -->

<hr>
<center>
	
	   <h2>JSJaCHttpPollingConnection.js</h2>
	
</center>

	


<h4>Summary</h4>
<p>
	
		All stuff related to HTTP Polling
 <BR/><BR/><B>Version: </B>$Revision: 452 $<BR/><BR/><B>Author:</B> Stefan Strigler steve@zeank.in-berlin.de
 <BR/>
	
</p>

<hr>


    <table border="1" cellpadding="3" cellspacing="0" width="100%">
    <tr bgcolor="#CCCCFF" class="TableHeadingColor">
    <td colspan=2><font size="+2">
    
        <b>Class Summary</b>
    
    </font></td>
    </tr>
    
    <tr bgcolor="white" class="TableRowColor">
    <td width="15%"><b><a href="JSJaCHttpPollingConnection.html">JSJaCHttpPollingConnection</a></b></td>
    <td>Implementation of <a href='http://www.xmpp.org/extensions/xep-0025.html'>HTTP Polling</a>
 </td>
    </tr>
    
    </table>
    <hr/> 


<!-- ========== METHOD SUMMARY =========== -->

<!-- ========== END METHOD SUMMARY =========== -->


        <pre class="sourceview"><span class="comment">/**
 * <span class="attrib">@fileoverview</span> All stuff related to HTTP Polling
 * <span class="attrib">@author</span> Stefan Strigler steve<span class="attrib">@zeank</span>.in-berlin.de
 * <span class="attrib">@version</span> $Revision: 452 $
 */</span>

<span class="comment">/**
 * Instantiates an HTTP Polling session
 * <span class="attrib">@class</span> Implementation of {<span class="attrib">@link</span>
 * http://www.xmpp.org/extensions/xep-0025.html HTTP Polling}
 * <span class="attrib">@extends</span> JSJaCConnection
 * <span class="attrib">@constructor</span>
 */</span>
<span class="reserved">function</span> JSJaCHttpPollingConnection(oArg) {
  <span class="comment">/**
   * <span class="attrib">@ignore</span>
   */</span>
  <span class="reserved">this</span>.base = JSJaCConnection;
  <span class="reserved">this</span>.base(oArg);

  <span class="comment">// give hint to JSJaCPacket that we're using HTTP Polling ...</span>
  JSJACPACKET_USE_XMLNS = false;
}
JSJaCHttpPollingConnection.<span class="reserved">prototype</span> = new JSJaCConnection();

<span class="comment">/**
 * Tells whether this implementation of JSJaCConnection is polling
 * Useful if it needs to be decided
 * whether it makes sense to allow for adjusting or adjust the
 * polling interval {<span class="attrib">@link</span> JSJaCConnection#setPollInterval}
 * <span class="attrib">@return</span> &lt;code&gt;true&lt;/code&gt; if this is a polling connection,
 * &lt;code&gt;false&lt;/code&gt; otherwise.
 * <span class="attrib">@type</span> boolean
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>.isPolling = <span class="reserved">function</span>() { <span class="reserved">return</span> true; };

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._getFreeSlot = <span class="reserved">function</span>() {
  <span class="reserved">if</span> (typeof(<span class="reserved">this</span>._req[0]) == <span class="literal">'undefined'</span> ||
      typeof(<span class="reserved">this</span>._req[0].r) == <span class="literal">'undefined'</span> ||
      <span class="reserved">this</span>._req[0].r.readyState == 4)
    <span class="reserved">return</span> 0;
  <span class="reserved">else</span>
    <span class="reserved">return</span> -1;
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._getInitialRequestString = <span class="reserved">function</span>() {
  var reqstr = <span class="literal">"0"</span>;
  <span class="reserved">if</span> (JSJAC_HAVEKEYS) {
    <span class="reserved">this</span>._keys = new JSJaCKeys(b64_sha1,<span class="reserved">this</span>.oDbg); <span class="comment">// generate first set of keys</span>
    key = <span class="reserved">this</span>._keys.getKey();
    reqstr += <span class="literal">";"</span>+key;
  }
  var streamto = <span class="reserved">this</span>.domain;
  <span class="reserved">if</span> (<span class="reserved">this</span>.authhost)
    streamto = <span class="reserved">this</span>.authhost;

  reqstr += <span class="literal">",&lt;stream:stream to='"</span>+streamto+<span class="literal">"' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'"</span>;
  <span class="reserved">if</span> (<span class="reserved">this</span>.authtype == <span class="literal">'sasl'</span> || <span class="reserved">this</span>.authtype == <span class="literal">'saslanon'</span>)
    reqstr += <span class="literal">" version='1.0'"</span>;
  reqstr += <span class="literal">"&gt;"</span>;
  <span class="reserved">return</span> reqstr;
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._getRequestString = <span class="reserved">function</span>(raw, last) {
  var reqstr = <span class="reserved">this</span>._sid;
  <span class="reserved">if</span> (JSJAC_HAVEKEYS) {
    reqstr += <span class="literal">";"</span>+<span class="reserved">this</span>._keys.getKey();
    <span class="reserved">if</span> (<span class="reserved">this</span>._keys.lastKey()) {
      <span class="reserved">this</span>._keys = new JSJaCKeys(b64_sha1,<span class="reserved">this</span>.oDbg);
      reqstr += <span class="literal">';'</span>+<span class="reserved">this</span>._keys.getKey();
    }
  }
  reqstr += <span class="literal">','</span>;
  <span class="reserved">if</span> (raw)
    reqstr += raw;
  <span class="reserved">while</span> (<span class="reserved">this</span>._pQueue.length) {
    reqstr += <span class="reserved">this</span>._pQueue[0];
    <span class="reserved">this</span>._pQueue = <span class="reserved">this</span>._pQueue.slice(1,<span class="reserved">this</span>._pQueue.length);
  }
  <span class="reserved">if</span> (last)
    reqstr += <span class="literal">'&lt;/stream:stream&gt;'</span>;
  <span class="reserved">return</span> reqstr;
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._getStreamID = <span class="reserved">function</span>() {
  <span class="reserved">if</span> (<span class="reserved">this</span>._req[0].r.responseText == <span class="literal">''</span>) {
    <span class="reserved">this</span>.oDbg.log(<span class="literal">"waiting for stream id"</span>,2);
    <span class="reserved">this</span>._timeout = setTimeout(JSJaC.bind(<span class="reserved">this</span>._sendEmpty, <span class="reserved">this</span>),1000);
    <span class="reserved">return</span>;
  }

  <span class="reserved">this</span>.oDbg.log(<span class="reserved">this</span>._req[0].r.responseText,4);

  <span class="comment">// extract stream id used for non-SASL authentication</span>
  <span class="reserved">if</span> (<span class="reserved">this</span>._req[0].r.responseText.match(/id=[\<span class="literal">'\"]([^\'</span>\<span class="literal">"]+)[\'\"</span>]/))
    <span class="reserved">this</span>.streamid = RegExp.$1;
  <span class="reserved">this</span>.oDbg.log(<span class="literal">"got streamid: "</span>+<span class="reserved">this</span>.streamid,2);

  var doc;

  try {
    var response = <span class="reserved">this</span>._req[0].r.responseText;
    <span class="reserved">if</span> (!response.match(/&lt;\/stream:stream&gt;\s*$/))
      response += <span class="literal">'&lt;/stream:stream&gt;'</span>;

    doc = XmlDocument.create(<span class="literal">"doc"</span>);
    doc.loadXML(response);
    <span class="reserved">if</span> (!<span class="reserved">this</span>._parseStreamFeatures(doc))
      <span class="reserved">return</span>;
  } catch(e) {
    <span class="reserved">this</span>.oDbg.log(<span class="literal">"loadXML: "</span>+e.toString(),1);
  }

  <span class="reserved">this</span>._connected = true;

  <span class="reserved">if</span> (<span class="reserved">this</span>.register)
    <span class="reserved">this</span>._doInBandReg();
  <span class="reserved">else</span>
    <span class="reserved">this</span>._doAuth();

  <span class="reserved">this</span>._process(<span class="reserved">this</span>._timerval); <span class="comment">// start polling</span>
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._getSuspendVars = <span class="reserved">function</span>() {
  <span class="reserved">return</span> new Array();
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._handleInitialResponse = <span class="reserved">function</span>() {
  <span class="comment">// extract session ID</span>
  <span class="reserved">this</span>.oDbg.log(<span class="reserved">this</span>._req[0].r.getAllResponseHeaders(),4);
  var aPList = <span class="reserved">this</span>._req[0].r.getResponseHeader(<span class="literal">'Set-Cookie'</span>);
  aPList = aPList.split(<span class="literal">";"</span>);
  <span class="reserved">for</span> (var i=0;i&lt;aPList.length;i++) {
    aArg = aPList[i].split(<span class="literal">"="</span>);
    <span class="reserved">if</span> (aArg[0] == <span class="literal">'ID'</span>)
      <span class="reserved">this</span>._sid = aArg[1];
  }
  <span class="reserved">this</span>.oDbg.log(<span class="literal">"got sid: "</span>+<span class="reserved">this</span>._sid,2);

  <span class="comment">/* start sending from queue for not polling connections */</span>
  <span class="reserved">this</span>._connected = true;

  <span class="reserved">this</span>._interval= setInterval(JSJaC.bind(<span class="reserved">this</span>._checkQueue, <span class="reserved">this</span>),
                              JSJAC_CHECKQUEUEINTERVAL);
  <span class="reserved">this</span>._inQto = setInterval(JSJaC.bind(<span class="reserved">this</span>._checkInQ, <span class="reserved">this</span>),
                            JSJAC_CHECKINQUEUEINTERVAL);

  <span class="comment">/* wait for initial stream response to extract streamid needed
   * for digest auth
   */</span>
  <span class="reserved">this</span>._getStreamID();
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._parseResponse = <span class="reserved">function</span>(r) {
  var req = r.r;
  <span class="reserved">if</span> (!<span class="reserved">this</span>.connected())
    <span class="reserved">return</span> null;

  <span class="comment">/* handle error */</span>
  <span class="comment">// proxy error (!)</span>
  <span class="reserved">if</span> (req.status != 200) {
    <span class="reserved">this</span>.oDbg.log(<span class="literal">"invalid response ("</span>+req.status+<span class="literal">"):"</span> + req.responseText+<span class="literal">"\n"</span>+req.getAllResponseHeaders(),1);

    <span class="reserved">this</span>._setStatus(<span class="literal">'internal_server_error'</span>);

    clearTimeout(<span class="reserved">this</span>._timeout); <span class="comment">// remove timer</span>
    clearInterval(<span class="reserved">this</span>._interval);
    clearInterval(<span class="reserved">this</span>._inQto);
    <span class="reserved">this</span>._connected = false;
    <span class="reserved">this</span>.oDbg.log(<span class="literal">"Disconnected."</span>,1);
    <span class="reserved">this</span>._handleEvent(<span class="literal">'ondisconnect'</span>);
    <span class="reserved">this</span>._handleEvent(<span class="literal">'onerror'</span>,JSJaCError(<span class="literal">'503'</span>,<span class="literal">'cancel'</span>,<span class="literal">'service-unavailable'</span>));
    <span class="reserved">return</span> null;
  }

  <span class="reserved">this</span>.oDbg.log(req.getAllResponseHeaders(),4);
  var sid, aPList = req.getResponseHeader(<span class="literal">'Set-Cookie'</span>);

  <span class="reserved">if</span> (aPList == null)
    sid = <span class="literal">"-1:0"</span>; <span class="comment">// Generate internal server error</span>
  <span class="reserved">else</span> {
    aPList = aPList.split(<span class="literal">";"</span>);
    var sid;
    <span class="reserved">for</span> (var i=0;i&lt;aPList.length;i++) {
      var aArg = aPList[i].split(<span class="literal">"="</span>);
      <span class="reserved">if</span> (aArg[0] == <span class="literal">'ID'</span>)
        sid = aArg[1];
    }
  }

  <span class="comment">// http polling component error</span>
  <span class="reserved">if</span> (typeof(sid) != <span class="literal">'undefined'</span> &amp;&amp; sid.indexOf(<span class="literal">':0'</span>) != -1) {
    switch (sid.substring(0,sid.indexOf(<span class="literal">':0'</span>))) {
    case <span class="literal">'0'</span>:
      <span class="reserved">this</span>.oDbg.log(<span class="literal">"invalid response:"</span> + req.responseText,1);
      break;
    case <span class="literal">'-1'</span>:
      <span class="reserved">this</span>.oDbg.log(<span class="literal">"Internal Server Error"</span>,1);
      break;
    case <span class="literal">'-2'</span>:
      <span class="reserved">this</span>.oDbg.log(<span class="literal">"Bad Request"</span>,1);
      break;
    case <span class="literal">'-3'</span>:
      <span class="reserved">this</span>.oDbg.log(<span class="literal">"Key Sequence Error"</span>,1);
      break;
    }

    <span class="reserved">this</span>._setStatus(<span class="literal">'internal_server_error'</span>);

    clearTimeout(<span class="reserved">this</span>._timeout); <span class="comment">// remove timer</span>
    clearInterval(<span class="reserved">this</span>._interval);
    clearInterval(<span class="reserved">this</span>._inQto);
    <span class="reserved">this</span>._handleEvent(<span class="literal">'onerror'</span>,JSJaCError(<span class="literal">'500'</span>,<span class="literal">'wait'</span>,<span class="literal">'internal-server-error'</span>));
    <span class="reserved">this</span>._connected = false;
    <span class="reserved">this</span>.oDbg.log(<span class="literal">"Disconnected."</span>,1);
    <span class="reserved">this</span>._handleEvent(<span class="literal">'ondisconnect'</span>);
    <span class="reserved">return</span> null;
  }

  <span class="reserved">if</span> (!req.responseText || req.responseText == <span class="literal">''</span>)
    <span class="reserved">return</span> null;

  try {
    var response = req.responseText.replace(/\&lt;\?xml.+\?\&gt;/,<span class="literal">""</span>);
    <span class="reserved">if</span> (response.match(/&lt;stream:stream/))
        response += <span class="literal">"&lt;/stream:stream&gt;"</span>;
    var doc = JSJaCHttpPollingConnection._parseTree(<span class="literal">"&lt;body&gt;"</span>+response+<span class="literal">"&lt;/body&gt;"</span>);

    <span class="reserved">if</span> (!doc || doc.tagName == <span class="literal">'parsererror'</span>) {
      <span class="reserved">this</span>.oDbg.log(<span class="literal">"parsererror"</span>,1);

      doc = JSJaCHttpPollingConnection._parseTree(<span class="literal">"&lt;stream:stream xmlns:stream='http://etherx.jabber.org/streams'&gt;"</span>+req.responseText);
      <span class="reserved">if</span> (doc &amp;&amp; doc.tagName != <span class="literal">'parsererror'</span>) {
        <span class="reserved">this</span>.oDbg.log(<span class="literal">"stream closed"</span>,1);

        <span class="reserved">if</span> (doc.getElementsByTagName(<span class="literal">'conflict'</span>).length &gt; 0)
          <span class="reserved">this</span>._setStatus(<span class="literal">"session-terminate-conflict"</span>);
			
        clearTimeout(<span class="reserved">this</span>._timeout); <span class="comment">// remove timer</span>
        clearInterval(<span class="reserved">this</span>._interval);
        clearInterval(<span class="reserved">this</span>._inQto);
        <span class="reserved">this</span>._handleEvent(<span class="literal">'onerror'</span>,JSJaCError(<span class="literal">'503'</span>,<span class="literal">'cancel'</span>,<span class="literal">'session-terminate'</span>));
        <span class="reserved">this</span>._connected = false;
        <span class="reserved">this</span>.oDbg.log(<span class="literal">"Disconnected."</span>,1);
        <span class="reserved">this</span>._handleEvent(<span class="literal">'ondisconnect'</span>);
      } <span class="reserved">else</span>
        <span class="reserved">this</span>.oDbg.log(<span class="literal">"parsererror:"</span>+doc,1);
		
      <span class="reserved">return</span> doc;
    }

    <span class="reserved">return</span> doc;
  } catch (e) {
    <span class="reserved">this</span>.oDbg.log(<span class="literal">"parse error:"</span>+e.message,1);
  }
  <span class="reserved">return</span> null;;
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._reInitStream = <span class="reserved">function</span>(to,cb,arg) {
  <span class="reserved">this</span>._sendRaw(<span class="literal">"&lt;stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' to='"</span>+to+<span class="literal">"' version='1.0'&gt;"</span>,cb,arg);
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._resume = <span class="reserved">function</span>() {
  <span class="reserved">this</span>._process(<span class="reserved">this</span>._timerval);
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._setupRequest = <span class="reserved">function</span>(async) {
  var r = XmlHttp.create();
  try {
    r.open(<span class="literal">"POST"</span>,<span class="reserved">this</span>._httpbase,async);
    <span class="reserved">if</span> (r.overrideMimeType)
      r.overrideMimeType(<span class="literal">'text/plain; charset=utf-8'</span>);
    r.setRequestHeader(<span class="literal">'Content-Type'</span>,<span class="literal">'application/x-www-form-urlencoded'</span>);
  } catch(e) { <span class="reserved">this</span>.oDbg.log(e,1); }

  var req = new Object();
  req.r = r;
  <span class="reserved">return</span> req;
};

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection.<span class="reserved">prototype</span>._suspend = <span class="reserved">function</span>() {};

<span class="comment">/*** [static] ***/</span>

<span class="comment">/**
 * <span class="attrib">@private</span>
 */</span>
JSJaCHttpPollingConnection._parseTree = <span class="reserved">function</span>(s) {
  try {
    var r = XmlDocument.create(<span class="literal">"body"</span>,<span class="literal">"foo"</span>);
    <span class="reserved">if</span> (typeof(r.loadXML) != <span class="literal">'undefined'</span>) {
      r.loadXML(s);
      <span class="reserved">return</span> r.documentElement;
    } <span class="reserved">else</span> <span class="reserved">if</span> (window.DOMParser)
      <span class="reserved">return</span> (new DOMParser()).parseFromString(s, <span class="literal">"text/xml"</span>).documentElement;
  } catch (e) { }
  <span class="reserved">return</span> null;
};
</pre>
	<hr>



<!-- ========== START OF NAVBAR ========== -->
<a name="navbar_top"><!-- --></a>
<table border="0" width="100%" cellpadding="1" cellspacing="0">
<tr>
<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
<a name="navbar_top_firstrow"><!-- --></a>
<table border="0" cellpadding="0" cellspacing="3">
  <tr align="center" valign="top">
  
  
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a>&nbsp;</td>
  <td bgcolor="#FFFFFF" class="NavBarCell1Rev">	&nbsp;<font class="NavBarFont1Rev"><b>File</b></font>&nbsp;</td>
  

  <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a>&nbsp;</td>
  </tr>
</table>
</td>
<td bgcolor="#EEEEFF" align="right" valign="top"><em>
<b>JSJaC</b></em>
</td>
</tr>

<tr>
<td bgcolor="white" class="NavBarCell2"><font size="-2">
&nbsp;PREV&nbsp;
&nbsp;NEXT</font></td>
<td bgcolor="white" class="NavBarCell2"><font size="-2">
  <a href="index.html" target="_top"><b>FRAMES</b></a>  &nbsp;
&nbsp;<a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
&nbsp;&nbsp;
<script>
  <!--
  if(window==top) {
    document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
  }
  //-->
</script>
<noscript>
<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
</noscript>
</font></td>
</tr>
</table>
<!-- =========== END OF NAVBAR =========== -->

<hr>
<font size="-1">

</font>
<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Tue Feb 12 18:46:55 2008</div>
</body>
</html>
